"""
病历数据预处理模块
----------------
功能：
1. 从病历 JSON 中提取完整信息；
2. 自动展开嵌套字段；
3. 格式化为模型可读文本；
4. 可选过滤空字段。
"""

import json
from typing import Any, Dict, List, Union


def flatten_json(data: Union[Dict, List, Any], parent_key: str = "", sep: str = ".") -> Dict[str, Any]:
    """
    将嵌套的 JSON 展平为一维字典。
    例如：
        {"patient": {"name": "张三", "age": 45}}
    转换为：
        {"patient.name": "张三", "patient.age": 45}
    """
    items = []
    if isinstance(data, dict):
        for k, v in data.items():
            new_key = f"{parent_key}{sep}{k}" if parent_key else k
            items.extend(flatten_json(v, new_key, sep=sep).items())
    elif isinstance(data, list):
        for i, v in enumerate(data):
            new_key = f"{parent_key}[{i}]"
            items.extend(flatten_json(v, new_key, sep=sep).items())
    else:
        items.append((parent_key, data))
    return dict(items)


def preprocess(record: Dict[str, Any], drop_empty: bool = False, sep: str = ".") -> str:
    """
    对病历 JSON 进行完整信息预处理。
    
    参数:
        record: 病历原始 JSON 对象。
        drop_empty: 是否丢弃空值字段。
        sep: 层级分隔符。
        
    返回:
        格式化后的纯文本字符串，可直接送入大模型。
    """
    # 展平嵌套结构
    flat_record = flatten_json(record, sep=sep)

    # 过滤空值
    if drop_empty:
        flat_record = {k: v for k, v in flat_record.items() if v not in ("", None, [], {})}

    # 统一格式化输出
    formatted_lines = []
    for key, value in flat_record.items():
        # 格式统一为 “字段名：内容”
        formatted_lines.append(f"{key}: {value}")

    return "\n".join(formatted_lines)


def preprocess_from_file(json_path: str) -> str:
    """
    从文件路径读取 JSON 并执行预处理。
    """
    with open(json_path, "r", encoding="utf-8") as f:
        record = json.load(f)
    return preprocess(record)
